// 数字 n 代表⽣成括号的对数，请你设计⼀个函数，⽤于能够⽣成所有可能的并且 有效的 括号组合。
// 示例：
// 输⼊：n = 3
// 输出：[
//  "((()))",
//  "(()())",
//  "(())()",
//  "()(())",
//  "()()()"
//  ]
// 如果不理解，可以放到html文件中，然后一步一步debug查看数据改变过程
// 需要两点符合 1.左括号和有括号各占n个
// 2.左侧每一个左括号都可以在右侧找到一个右括号和它对应，
const generateParenthesis = n => {
  const res = []

  const generate = (str, left, right) => {
    if (str.length === 2 * n) {
      res.push(str)
      return
    }
    if (left > 0) {
      generate(str + '(', left - 1, right)
    }
    if (right > left) {
      generate(str + ')', left, right - 1)
    }
  }
  generate('', n, n)
  return res
}

let m = generateParenthesis(3)
// console.log(m)
let n = (0 + 2) >> 1
console.log(n)

// 最初的原始的做法是循环产生所有的可能
// 下面这种写法可以产生所有的情况，他只有一个限制条件就是str.length === 2 * n
// 所以生成的字符串是左右括号组成的长度为2n的字符串，它有各种的组合可能
// 然后需要我们做的就是删除其中不符合的
// 第一种就是左侧最多为n个，超过了就不要了
// 第二种就是右侧括号，如果数据比左侧大，就表明需要加一个跟右侧做好平衡
const generateParenthesis2 = n => {
  const res = []
  const generate = (str, left, right) => {
    if (str.length === 2 * n) {
      res.push(str)
      return
    }
    generate(str + '(')
    generate(str + ')')
  }
  generate('', n, n)
  return res
}
